package main

import (
	"encoding/json"
	"fmt"
	"helloword01/22billrecordprac/model"
	"os"
	"time"
)

type MoneyStatistics struct {
	records    []*model.Record
	totalMoney float64
}

var ms *MoneyStatistics

const (
	MoneyIn  = "收入"
	MoneyOut = "支出"
)

func main() {
	var input string
	for {
		mainMenu()
		fmt.Scanf("%s \n", &input)

		switch input {
		case "1":
			ms.getRecords()
			break
		case "2":
			fmt.Println("输入金额：")
			var money float64
			fmt.Scanf("%f \n", &money)
			fmt.Println("输入描述：")
			var des string
			fmt.Scanf("%s \n", &des)
			ms.MoneyIn(money, des)
			break
		case "3":
			fmt.Println("输入金额：")
			var money float64
			fmt.Scanf("%f \n", &money)
			fmt.Println("输入描述：")
			var des string
			fmt.Scanf("%s \n", &des)
			err := ms.MoneyOut(money, des)
			if err != nil {
				fmt.Println(err.Error())
			}
			break
		case "4":
			fmt.Println("您已经退出系统")
			os.Exit(0)
		default:
			fmt.Println("输入错误")
			break

		}

	}
}

func mainMenu() {
	fmt.Println("--------------家庭收支记账系统--------------")
	fmt.Println("--------------[1] 收 支 明 细--------------")
	fmt.Println("--------------[2] 登 记 收 入--------------")
	fmt.Println("--------------[3] 登 记 支 出--------------")
	fmt.Println("--------------[4]  退   出  --------------")
	fmt.Println("--------------请 选 择【1~4】--------------")
}

// init
//
//	@Description: 初始化统计数据
func init() {
	ms = &MoneyStatistics{
		records:    make([]*model.Record, 0),
		totalMoney: 10000.0,
	}
	fmt.Println("初始化统计记录~")
}

// getRecords
//
//	@Description: 获取收支明细
//	@receiver ms
func (ms *MoneyStatistics) getRecords() {
	records := ms.records
	fmt.Println(">>>>>>>>>>收 支 明 细>>>>>>>>>>")
	for _, record := range records {
		marshal, _ := json.Marshal(record)
		fmt.Println(string(marshal))
	}
	fmt.Println("<<<<<<<<<<收 支 明 细<<<<<<<<<<")
}

// MoneyIn
//
//	@Description: 登 记 收 入
//	@receiver ms
//	@param money
//	@param des
func (ms *MoneyStatistics) MoneyIn(money float64, des string) {
	r := &model.Record{
		Money:   money,
		Desc:    des,
		Type:    MoneyIn,
		Time:    time.Now().Format("2006-01-02 15:04:05"),
		Id:      len(ms.records) + 1,
		Balance: money + ms.totalMoney, //总金额+收入
	}
	ms.records = append(ms.records, r) //追加记录
	ms.totalMoney += money
}

// MoneyOut
//
//	@Description:  登 记 支 出
//	@receiver ms
//	@param money
//	@param des
//	@return error
func (ms *MoneyStatistics) MoneyOut(money float64, des string) error {
	if ms.totalMoney < money {
		return fmt.Errorf("余额不足")
	}
	r := &model.Record{
		Money:   money,
		Desc:    des,
		Type:    MoneyOut,
		Time:    time.Now().Format("2006-01-02 15:04:05"),
		Id:      len(ms.records) + 1,
		Balance: ms.totalMoney - money, //总金额-支出
	}
	ms.records = append(ms.records, r) //追加记录
	ms.totalMoney -= money
	return nil
}
